package com.linkedlist.doubly;

import com.linkedlist.doubly.Node;

public class DoublyLinkedList {
    private Node head;

    public DoublyLinkedList() {
        this.head = new Node("");
    }

    // 添加节点
    public void addNode(Node node) {
        Node tmp = head;

        // 遍历链表，寻找最后节点
        while (true) {
            if (tmp.next == null) {
                break;
            }
            tmp = tmp.next;
        }
        // 添加节点
        tmp.next = node;
        node.pre = tmp;
    }

    // 遍历节点
    public void show() {
        // 判断链表是否为空
        if (head.next == null) {
            throw new RuntimeException("链表空，无法显示");
        }
        // 遍历链表
        Node tmp = head.next;
        while (true) {
            if (tmp == null) {
                break;
            }
            System.out.println(tmp.data);
            tmp = tmp.next;
        }
    }

    // 在指定位置后面插入节点
    public void insertNode(Node node, int pos) {
        Node tmp = head;

        for (int i = 1; i <= pos; i++) {
            tmp = tmp.next;
            if (tmp == null) {
                throw new RuntimeException("链表长度小于提供的位置");
            }
        }

        node.next = tmp.next;
        tmp.next.pre = node;
        tmp.next = node;
        node.pre = tmp;
    }

    // 修改指定位置的节点
    public void modifyNode(String data, int pos) {
        Node tmp = head;

        for (int i = 1; i <= pos; i++) {
            tmp = tmp.next;
            if (tmp == null) {
                throw new RuntimeException("链表长度小于提供的位置");
            }
        }

        tmp.data = data;
    }

    // 删除指定位置的节点
    public void deleteNode(int pos) {
        Node tmp = head;

        for (int i = 1; i <= pos; i++) {
            tmp = tmp.next;
            if (tmp == null) {
                throw new RuntimeException("链表长度小于提供的位置");
            }
        }

        tmp.pre.next = tmp.next;
        tmp.next.pre = tmp.pre;
    }
}
